package com.lyl.mysqlmonitor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * MySQL版本检测工具类
 * 用于检测连接的MySQL数据库版本并提供兼容性支持
 */
public class MySQLVersionDetector {

    private static final Logger LOGGER = LoggerFactory.getLogger(MySQLVersionDetector.class);

    // MySQL版本正则表达式
    private static final Pattern VERSION_PATTERN = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)");

    // MySQL主要版本常量
    public static final int MYSQL_5_7 = 57;
    public static final int MYSQL_8_0 = 80;

    /**
     * 私有构造函数，防止实例化
     */
    private MySQLVersionDetector() {
    }

    /**
     * 检测MySQL数据库版本
     *
     * @param connection 数据库连接
     * @return 返回以整数表示的MySQL版本，如57表示5.7.x，80表示8.0.x
     * @throws SQLException 如果获取版本信息失败
     */
    public static int detectVersion(Connection connection) throws SQLException {
        if (connection == null) {
            throw new IllegalArgumentException("数据库连接不能为空");
        }

        DatabaseMetaData metaData = connection.getMetaData();
        String productVersion = metaData.getDatabaseProductVersion();

        LOGGER.debug("数据库版本信息: {}", productVersion);

        // 解析版本号
        Matcher matcher = VERSION_PATTERN.matcher(productVersion);
        if (matcher.find()) {
            int majorVersion = Integer.parseInt(matcher.group(1));
            int minorVersion = Integer.parseInt(matcher.group(2));

            // 组合主要版本号，如5.7返回57，8.0返回80
            int version = majorVersion * 10 + minorVersion;
            LOGGER.info("检测到MySQL版本: {}.{}", majorVersion, minorVersion);

            return version;
        } else {
            LOGGER.warn("无法解析MySQL版本: {}", productVersion);
            // 默认假设为8.0
            return MYSQL_8_0;
        }
    }

    /**
     * 检查是否为MySQL 5.7版本
     *
     * @param version 版本号
     * @return 如果是5.7版本返回true，否则返回false
     */
    public static boolean isMySQL57(int version) {
        return version == MYSQL_5_7;
    }

    /**
     * 检查是否为MySQL 8.0版本
     *
     * @param version 版本号
     * @return 如果是8.0版本返回true，否则返回false
     */
    public static boolean isMySQL80(int version) {
        return version == MYSQL_8_0;
    }

    /**
     * 获取版本的字符串表示
     *
     * @param version 版本号
     * @return 版本的字符串表示，如"5.7"或"8.0"
     */
    public static String getVersionString(int version) {
        if (version == MYSQL_5_7) {
            return "5.7";
        } else if (version == MYSQL_8_0) {
            return "8.0";
        } else {
            return String.format("%d.%d", version / 10, version % 10);
        }
    }
}
